﻿#ifndef PARSEUTIL_H
#define PARSEUTIL_H

/*
 * 该工具类用于将socket读取到的QByteArray信息转化为我们可以识别的Message信息
 * 我们需要利用该工具类,将Message中的stream,function,messagetext等信息全部提取出来
 * 总的方向是：QByteArray-->Message
 */
#include "src/enum/secsenum.h"
#include "src/util/conversionutil.h"
#include "src/messagetext/text.h"

#include <QObject>

class ParseUtil : public QObject
{
    Q_OBJECT
public:
    /*
     * 这是该工具类的第1大类方法:解析出MessageHeader中的信息
     */
    static quint16 Get_SessionId(QByteArray array);
    static quint32 Get_TransactionId(QByteArray array);
    static quint8 Get_Stream(QByteArray array);
    static quint8 Get_Function(QByteArray array);
    static SecsEnum::Formate Get_DataType(QByteArray array);

    static SecsEnum::SelectStatus Get_SelectStatus(QByteArray array);
    static SecsEnum::DeselectStatus Get_DeselectStatus(QByteArray array);
    static SecsEnum::RejectReasonCode Get_RejectReasonCode(QByteArray array);

    static bool Is_DataMessage(QByteArray array);
    static bool Is_ControlMessage(QByteArray array);
    static bool Is_PrimaryMessage(QByteArray array);
    static bool Is_ReplyMessage(QByteArray array);
    static bool Is_SelectReq(QByteArray array);
    static bool Is_SelectRsp(QByteArray array);
    static bool Is_DeselectReq(QByteArray array);
    static bool Is_DeselectRsp(QByteArray array);
    static bool Is_LinkTestReq(QByteArray array);
    static bool Is_LinkTestRsp(QByteArray array);
    static bool Is_RejectReq(QByteArray array);
    static bool Is_SeparateReq(QByteArray array);


    /*
     * 这是该工具类的第2大类方法:解析出MessageText中的信息
     * 在实际调用中,只需要调用第一个方法即可
     */

    static Text* Get_MessageText(QByteArray array);

private:
    static Text* Get_MessageText(QByteArray array, int startPosition);

    /*
     * 下面这几种解析数据结构的方法全部是为Get_MessageText(QByteArray array, int startPosition)这个方法服务的
     * startPosition:数据开始解析的真正的位置,即MessageText中的Data开始的位置
     * length:对于非LIST数据类型,代表了MessageText中的Data的字节长度
     *        对于LIST数据类型,代表了LIST中包含了几个子元素
     */
    static TextList* parseLIST(QByteArray msg, int startPosition, int length);
    static TextASCII* parseASCII(QByteArray msg, int startPosition, int length);
    static TextBoolean* parseBool(QByteArray msg, int startPosition, int length);
    static TextF4* parseF4(QByteArray msg, int startPosition, int length);
    static TextF8* parseF8(QByteArray msg, int startPosition, int length);
    static TextI1* parseI1(QByteArray msg, int startPosition, int length);
    static TextI2* parseI2(QByteArray msg, int startPosition, int length);
    static TextI4* parseI4(QByteArray msg, int startPosition, int length);
    static TextI8* parseI8(QByteArray msg, int startPosition, int length);
    static TextU1* parseU1(QByteArray msg, int startPosition, int length);
    static TextU2* parseU2(QByteArray msg, int startPosition, int length);
    static TextU4* parseU4(QByteArray msg, int startPosition, int length);
    static TextU8* parseU8(QByteArray msg, int startPosition, int length);
    static TextBinary* parseBinary(QByteArray msg, int startPosition, int length);
};

#endif // PARSEUTIL_H
